/**
 * 注册路由相关事件处理
 */

const userModel = require('../models/userModel')

// 注册功能函数
const saveDb = (data) => {
  // 将生日转化为时间戳的格式
  let birthday = data.birthday.replace(/[^0-9]/g, '-')    // 获取生日
  let birDate = new Date(birthday).getTime() / 1000   // 转化
  data.birthday = birDate
  
  // 使用promise第一层处理用户名是否重复
  return new Promise((resolve, reject) => {
    userModel.findOne({ user_name: data.name }, (err, suc) => {
      if (err) {
        reject({ msg: '用户名查询失败' })
      } else {
        resolve(suc)
      }
    })
  }).then(res => { // 查询用户名是否重复成功
    // 对第一层promise抛出的结果进行处理并返回给路由处理文件
    if (res) {
      return Promise.resolve({msg: '用户名已存在', code: 401})
    } else {
      // 用户名不重复的情况下，进行promise第二层处理，先调用封装好的函数获取id，再进行用户信息的保存
      return new Promise((resolve, reject) => {
        search_id().then(id => {  // id获取成功,并进行数据的保存
          new userModel({
            user_id: id,
            user_name: data.name,
            user_age: data.age,
            user_birthday: data.birthday,
            user_phone: data.phone,
            user_password: data.password,
            user_sex: data.sex
          }).save((err, res) => {
            if (err) {
              reject({ msg: '保存进数据库失败' })
            } else {
              resolve({msg: '注册成功', code: 200})
            }
          })
        }).catch(err => { // id获取失败
          console.log(err)
          return err
        })
      })
    } 
  }).then(res => { 
    return res
  })
}

// 获取id功能函数
function search_id() {
  let id = randomNum(0, 1000000000)
  // 先查看数据库内是否有重复的id
  return new Promise((resolve, reject) => {
    userModel.findOne({ user_id: id }, (err, suc) => {
      if (err) {
        reject({msg: 'id查询失败'})
      } else {
        resolve(suc)
      }
    })
  }).then(res => {
    if (res) {
      // id重复,重新调用自身
      return search_id()
    } else {
      return id
    }
  })
}


// 生成从minNum到maxNum的随机数
// 有包含区间
function randomNum(minNum, maxNum) {
  switch (arguments.length) {
    case 1:
      return parseInt(Math.random() * minNum + 1, 10);
      break;
    case 2:
      return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
      break;
    default:
      return 0;
      break;
  }
}


module.exports = {
  saveDb
}